PL/SQL 将本地集合传递给流水线函数答案 |
您所在的位置:网站首页 › plsql 函数返回 › PL/SQL 将本地集合传递给流水线函数答案 |
我需要将一个本地定义的表类型传递给一个函数,该函数是一个返回另一个本地定义的表类型的流水线函数。 这里是示例数据: create table my_tab (i NUMBER, n VARCHAR2(30)); insert into my_tab values (1, 'Peter'); insert into my_tab values (2, 'Dakshesh'); insert into my_tab values (1, 'Maggie'); insert into my_tab values (3, 'Madhu'); commit;我的代码是: CREATE OR REPLACE PACKAGE my_pkg IS TYPE t_col IS RECORD( i NUMBER, n VARCHAR2(30)); TYPE t_nested_table IS TABLE OF t_col; TYPE t_number IS TABLE OF NUMBER; FUNCTION iterate_table RETURN t_number PIPELINED; FUNCTION return_table(in_t_num t_number) RETURN t_nested_table PIPELINED; g_number t_number ; g_nested_number t_nested_table ; END my_pkg; /主体: CREATE OR REPLACE PACKAGE BODY my_pkg IS FUNCTION iterate_table RETURN t_number PIPELINED IS BEGIN IF ( (g_number IS NOT NULL) AND (g_number.EXISTS (1))) THEN FOR i IN 1 .. g_number.COUNT LOOP IF g_number (i) IS NOT NULL THEN PIPE ROW (g_number (i)); END IF; END LOOP; END IF; RETURN; EXCEPTION WHEN OTHERS THEN RAISE; END iterate_table; FUNCTION return_table(in_t_num t_number) RETURN t_nested_table PIPELINED IS l_row t_nested_table ; CURSOR cur_test IS select mt.i, mt.n from my_tab mt, TABLE(iterate_table ) tab where mt.i = tab.column_value; BEGIN OPEN cur_test; FETCH cur_test BULK COLLECT into l_row; CLOSE cur_test; FOR i IN 1..l_row.COUNT LOOP PIPE ROW(l_row(i)); END LOOP; RETURN; END return_table; END my_pkg; /现在这段代码编译成功了,当我尝试像流水线函数一样调用它时,它给出了错误- select * from table(my_pkg.return_table(my_pkg.t_number(1)));错误- ORA-00902: invalid datatype 00902. 00000 - "invalid datatype" *Cause: *Action: Error at Line: 14 Column: 41 此代码的两个先决条件是 - 集合应该都是本地定义的。 函数应该是流水线的。 救命!! 我没有收到任何关于表及其单个表的错误,因此没有外键约束。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |